package pr2012.practico4.grafos;

public class TGrafoNoDirigido implements IGrafoNoDirigido {
	private TLista vertices;
	
	@Override
	public boolean insertarVertice(Comparable unaEtiqueta) {
		 if (buscarVertice(unaEtiqueta) != null){
             return false;
     }
     TVertice vert = new TVertice(unaEtiqueta);
     TElemento elem = new TElemento(unaEtiqueta, vert);
     vertices.insertarAlFinal(elem);
     return true;
	}
	
    public TVertice buscarVertice(Comparable unaEtiqueta) {
        TElemento elem = (TElemento) vertices.buscarEtiqueta(unaEtiqueta);
        if (elem != null)
                return (TVertice) elem.datos;
        return null;
    }

	@Override
	public boolean existeVertice(Comparable unaEtiqueta) {
		 return (this.vertices.buscarEtiqueta(unaEtiqueta) != null);
	}

	@Override
	public boolean insertarAdyacencia(Comparable etiquetaOrigen,Comparable etiquetaDestino, Comparable costo) {
		TVertice origen = this.buscarVertice(etiquetaOrigen);
        TVertice destino = this.buscarVertice(etiquetaDestino);
        if ((origen != null) && (destino != null)){
        		boolean dest= destino.insertarAdyacencia(origen, costo);
                boolean orig= origen.insertarAdyacencia(destino, costo);
                return dest&&orig;
        }else{
                return false;
        }
	}

	@Override
	public boolean existeAdyacencia(Comparable etiquetaOrigen,Comparable etiquetaDestino) {
		 TElemento origen = (TElemento) vertices.buscarEtiqueta(etiquetaOrigen);
		 TElemento destino = (TElemento) vertices.buscarEtiqueta(etiquetaDestino);
         if (origen != null && destino!=null){
                 TVertice vertOrigen = (TVertice) origen.datos;
                 TVertice vertDestino = (TVertice) destino.datos;
                 if(vertOrigen.buscarAdyacencia(etiquetaDestino)!=null&&vertDestino.buscarAdyacencia(etiquetaOrigen)!=null){
                         return true;
                 }
         }
         return false;
	}

	@Override
	public TRecorrido bpf(Comparable etiquetaOrigen) {
		TRecorrido recorrido = new TRecorrido();
		TElemento elem =  vertices.buscarEtiqueta(etiquetaOrigen);
		TVertice unVertice = (TVertice) elem.datos;
		return unVertice.bpf(recorrido);
	}

	@Override
	public boolean eliminarVertice(Comparable nombreVertice) {
		TElemento actual =this.vertices.primero;
		while (actual!=null){
			eliminarAdyacencia(actual.etiqueta,nombreVertice);
			eliminarAdyacencia(nombreVertice,actual.etiqueta);
			actual=actual.siguiente;
		}
		return this.vertices.eliminarEtiqueta(nombreVertice);
	}

	@Override
	public boolean eliminarAdyacencia(Comparable nomVerticeOrigen,Comparable nomVerticeDestino) {
		TVertice origen = this.buscarVertice(nomVerticeOrigen);
		TVertice destino = this.buscarVertice(nomVerticeDestino);
		boolean o =origen.eliminarAdyacencia(nomVerticeDestino);
		boolean d =destino.eliminarAdyacencia(nomVerticeOrigen);
	    return o&&d;
	}

	@Override
	public TCamino bea(Comparable etiquetaOrigen) {
		return null;
//        TVertice vertice = (TVertice) vertices.buscarEtiqueta(etiquetaOrigen);
//        TLista cola = new TLista();
//        vertice.visitado=true;
//        cola.insertarAlFinal(etiquetaOrigen);
//        while (!cola.esVacia()){
//        	cola.quitarPrimero();
//        	while (vertice.siguienteAdyacente(vertice)!=null){
//                if (vertice.siguienteAdyacente(vertice).visitado=false){
//                        cola.insertarAlFinal((IElemento) vertice.siguienteAdyacente(vertice));
//                        vertice.siguienteAdyacente(vertice).visitado=true;
//                }
//        	}
//        }
//        //aca va la fruta!
//        TRecorrido recorrido = (TRecorrido) cola;
//        return recorrido;
	}
}
